const fs = require('fs'); // 我们现在说的这个可读流是基于文件
const path = require('path')
const ReadStream = require('./3.手写readStream') 
// 返回的是一个可读流对象,返回的结果是一个可读流的实例,是非流动模式---我们最后要转为流动模式
// 转流动模式需要on事件监测
// 父类叫Readable接口， 我们使用的文件可读流是继承于这个Readable的
// const rs = fs.createReadStream(path.resolve(__dirname,'a.txt'),{
const rs = new ReadStream(path.resolve(__dirname,'a.txt'),{
   flags: 'r',// fs.open
   encoding:null, // 默认就是buffer
   mode:0o666, // fs.open(mode)
   autoClose: true, // 读取后是否自动关闭
   emitClose:true, // 是否内部触发一个事件 emit('close')
   start:0, // 从哪到哪
   // end:5, // 0 - 5 6个字节 包前又包后
   highWaterMark:6,// 64k  每次读取多少个字节 默认64*1024字节
}); // 可读流默认一次读取64k

rs.on('open',function(fd){ // 此方法是fs可读流中自己实现的
    console.log(fd); // fs.open('xxx','r') => fd
})
const arr = []; // 这里需要采用Buffer的concat， 因为字符串拼接可能会导致乱码
// 在内部不断触发rs.emit('data',数据)；data不能更改,流动模式开启后，数据会疯狂触发data事件
rs.on('data',function(chunk){ // fs.read() -> rs.emit('data',读取到的数据)
    console.log('data',chunk)
    arr.push(chunk);
    // 我们希望能控制读取的速率 ，读完后 等我写入到文件中了 在去读取
    rs.pause(); // 不会触发data事件   配合可写流 
})
rs.on('end',function(){ // 当指定的内容读取完毕后 会触发end事件   rs.emit('end')
    console.log('end',Buffer.concat(arr).toString())
})
rs.on('close',()=>{  //  rs.emit('close')
    console.log('close')
    clearTimeout(timer)
})
rs.on('error',function(){  //  rs.emit('error')
   console.log('error')
}) 
timer = setInterval(()=>{
    rs.resume() // 1s 后恢复读取 再触发data事件
},1000)

// rs.resume() 恢复读取
// rs.pause()  暂停读取
//这两个都控制是否继续触发data事件